<?php if ( ! defined('BASEPATH')) exit('No se permite acceso directo al script');

require_once 'application/phpexcel/PHPExcel.php';

class To_excel {
	private $autor = "Inalta";

	function cargarExcel($inputFileName, $dataOnly = TRUE, $columnas = NULL, $rowDesde = NULL, $rowHasta = NULL) {

		// Identifico el tipo de archivo Excel (2007, 2010, 2003, etc)
		$tipo_archivo = PHPExcel_IOFactory::identify($inputFileName);

		// Creo un nuevo Reader para el tipo de archivo identificado
		$objReader = PHPExcel_IOFactory::createReader($tipo_archivo);
		$objReader->setReadDataOnly($dataOnly);

		if($rowDesde != NULL || $rowHasta != NULL || is_array($columnas)) {
			if($rowDesde != NULL || $rowHasta != NULL) {
				if($rowDesde == NULL) $rowDesde = 0;
				if($rowHasta == NULL) $rowHasta = 0;

				$filtro = new ReadFilter_Files($rowDesde, $rowHasta, array());
				$objReader->setReadFilter($filtro);
			}
			else {
				if(is_array($columnas)) {
					$filtro = new ReadFilter_Columns(0, 0, $columnas);
					$objReader->setReadFilter($filtro);
				}
			}
		}

		// Cargo un archivo en un objeto PHPExcel
		$objPHPExcel = $objReader->load($inputFileName);

		return $objPHPExcel;
	}

	function getExcelObject($titulo = '', $inputFileName = '')
	{
		//require_once 'application/phpexcel/PHPExcel.php';

		# Si se envía un archivo modelo, tomo ese a partir del cual trabajar. Sino creo una hoja nueva
		if (!empty($inputFileName)) $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
		else $objPHPExcel = new PHPExcel();

		// Establecer propiedades básicas del Excel
		$objPHPExcel->getProperties()
		->setTitle($titulo)
		->setSubject($titulo)
		->setCreator($this->autor)
		->setLastModifiedBy($this->autor);
		
		$styleArray = array(
			'font' => array(
				'name' => 'Calibri', 
				'size' => 11
			),
			'alignment' => array(
				'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_LEFT,
				'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,
			)
		);
		// Defino estilos del cuerpo en general del documento
		$objPHPExcel->getDefaultStyle()->applyFromArray($styleArray);

		return $objPHPExcel;	
	}

	function getHeadersStyle()
	{
		$styleArray = array(
				'font' => array(
					'bold' => true,
					'name' => 'Calibri', 
					'size' => 12
				),
				'alignment' => array(
					'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
					'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,
				),
				'borders' => array(
					'top' => array(
						'style' => PHPExcel_Style_Border::BORDER_THIN,
					),
					'bottom' => array(
						'style' => PHPExcel_Style_Border::BORDER_THIN,
					),
				)
			);

		return $styleArray;
	}

	function getTitleStyle()
	{
		$styleArray = array(
			'font' => array(
				'bold' => true,
				'name' => 'Calibri', 
				'size' => 20
			),
			'alignment' => array(
				'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
				'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,
			)
		);

		return $styleArray;
	}

	function getExcelDrawing()
	{
		return new PHPExcel_Worksheet_Drawing();
	}

	function setFecha($objPHPExcel, $celdaInicio, $celdaFin, $valor = NULL) {
		if ($valor == NULL) $valor = time();

		$excelDateValue = PHPExcel_Shared_Date::PHPToExcel($valor);
		$this->setValorCelda($objPHPExcel, $celdaInicio, $celdaFin, $excelDateValue, array());

		$objPHPExcel->getActiveSheet()->getStyle($celdaInicio . ':' . $celdaFin)
					->getNumberFormat()
					->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DATETIME);
	}

	function setImagen($objPHPExcel, $celdaInicio, $celdaFin, $path, $descripcion = 'Logo de la empresa') {
		$path_img = './img/' . $path;
		if (file_exists($path_img)) {
			$objDrawing = $this->getExcelDrawing();
			$objDrawing->setName($descripcion);
			$objDrawing->setDescription($descripcion);
			$objDrawing->setPath($path_img);
			$objDrawing->setResizeProportional(true);
			$objDrawing->setHeight(60);
			$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
			
			$celda = $celdaInicio;
			$objDrawing->setCoordinates($celdaInicio);
			if ($celdaInicio != $celdaFin) {
				$celda .= ':' . $celdaFin;
				$objPHPExcel->getActiveSheet()->mergeCells($celda);
			}
		}
	}

	function setEmpresa($objPHPExcel, $celdaInicio, $celdaFin, $valor) {
		$arrayStyle = array(
				'font' => array(
					'bold' => true,
					'name' => 'Calibri', 
					'size' => 14,
					'color' => array('rgb' => 'A9A9A9')
				),
				'alignment' => array(
					'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_LEFT,
					'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,
				)
			);
		$this->setValorCelda($objPHPExcel, $celdaInicio, $celdaFin, $valor, $arrayStyle);
	}

	function setTituloInforme($objPHPExcel, $celdaInicio, $celdaFin, $valor) {
		$arrayStyle = $this->getTitleStyle();
		$this->setValorCelda($objPHPExcel, $celdaInicio, $celdaFin, $valor, $arrayStyle);
	}

	function setValorCelda($objPHPExcel, $celdaInicio, $celdaFin, $valor, $arrayStyle){
		$celda = $celdaInicio;
		$objPHPExcel->setActiveSheetIndex(0)->setCellValue($celda, $valor);
		if ($celdaInicio != $celdaFin) {
			$celda .= ':' . $celdaFin;
			$objPHPExcel->getActiveSheet()->mergeCells($celda);
		}
		$objPHPExcel->getActiveSheet()->getStyle($celda)->applyFromArray($arrayStyle);
	}
}

class ReadFilter_Columns implements PHPExcel_Reader_IReadFilter {
	private $_startRow = 0;
	private $_endRow = 0;
	private $_columns = array();

	function __construct($startRow, $endRow, $columns) {
		$this->_startRow = $startRow;
		$this->_endRow = $endRow;
		$this->_columns = $columns;
	}

	public function readCell($column, $row, $worksheet = '') {
		if(in_array($column, $this->_columns)) {
			return TRUE;
		}
		else return FALSE;
	}

}

class ReadFilter_Files implements PHPExcel_Reader_IReadFilter {
	private $_startRow = 0;
	private $_endRow = 0;
	private $_columns = array();

	function __construct($startRow, $endRow, $columns) {
		$this->_startRow = $startRow;
		$this->_endRow = $endRow;
		$this->_columns = $columns;
	}

	public function readCell($column, $row, $worksheet = '') {
		// Sólamente cargo las filas que me interesan 
	    if ($row >= $this->_startRow && $row <= $this->_endRow) { 
	        return true;
	    }
	    else return false;
	}

}
/* Fin del archivo */